<?php

/**
 * Description of FacturaServicios
 *
 * @author  Mariano Renkine
 * @author  Fernando Arau
 */
require_once '../includes/utils.php';

class FacturaServicios extends Servicios
{

  function cerrarComprobante(FacturaDTO $facturaDTO)
  {
    $comprobanteDTO = new ComprobanteDTO();
    $comprobanteServicios = new ComprobanteServicios();
    $comprobanteDTO = $comprobanteServicios->buscar(5);
    $comprobanteDTO->setNroFactura($facturaDTO->getNroFactura());
    $comprobanteServicios->modificar($comprobanteDTO);
  }

  function agregar(FacturaDTO $facturaDTO)
  {
    $repoFactura = new RepoFactura();
    return $repoFactura->agregar($this->deDTO($facturaDTO));
  }

  function generar(FacturaDTO $facturaDTO)
  {
    // $facturaDTO->setTipoFactura($tipoFactura);
    $nroFactura = $this->emitirFacturaFiscal($facturaDTO);
    if (is_numeric($nroFactura) && $nroFactura < 0)
      return 0;
    $comprobanteS = new ComprobanteServicios();
    $facturaDTO->setNroFactura($nroFactura);
    //return $nroFactura;
    $idFactura = $this->agregar($facturaDTO);
    if ($idFactura > 0)
    {
      $res = $comprobanteS->cerrarFactura($facturaDTO->getComprobante(), $idFactura);
      if ($res != false)
      {
        return $nroFactura;
      } else
      {
        return 0;
      }
    } else
    {
      return 0;
    }
  }

  function modificar(FacturaDTO $facturaDTO)
  {
    
  }

  function generarFacturaA(FacturaDTO $facturaDTO)
  {
    $comprobanteS = new ComprobanteServicios();
    $detalle = $facturaDTO->getDetalle();
    $comprobante = $comprobanteS->buscar($facturaDTO->getComprobante());

    $total = 0;
    $razonSocial = ExtraerCaracteresNoASCII($facturaDTO->getRazonSocial());
    $domicilio = ExtraerCaracteresNoASCII($facturaDTO->getDomicilio());
    $out = "";
    $out .= "@FACTABRE|T|S|A|1|F|10|I|" . $facturaDTO->getTipoIva() . "|" . $razonSocial . "||CUIT|" . $facturaDTO->getCuit() . "|N|" . $domicilio . "|||Comprobante: " . $facturaDTO->getComprobante() . "||C<EOF>";
    for ($i = 0; $i < count($detalle); $i++)
    {
      $importeItem = $detalle[$i]->getImporte() / (1 + IVAGENERAL / 100);
      $importeItem = round($importeItem, 2);

      $out .="@FACTITEM|" . $detalle[$i]->getDescripcion() . "|" . $detalle[$i]->getCantidad() . ".0|" . $importeItem . ".00|0." . IVAGENERAL . "|M|1|0||||0|0<EOF>";
      $total += $detalle[$i]->getImporte();
    }
    $out .="@FACTPAGO|PAGO|" . $comprobante->getTotalComprobante() . ".00|T<EOF>";
    $out .="@FACTCIERRA|T|A|FINAL<EOF>";
    return $out;
  }

  function generarFacturaB(FacturaDTO $facturaDTO)
  {
    $comprobanteS = new ComprobanteServicios();
    $detalle = $facturaDTO->getDetalle();
    $comprobante = $comprobanteS->buscar($facturaDTO->getComprobante());

    $total = 0;
    //$out .= "@PONEENCABEZADO|5|EJEMPLO FACTURA A<EOF>";
    $out = "";

    $out .= "@FACTABRE|T|S|B|1|F|10|I|" . $facturaDTO->getTipoIva() . "|" . $facturaDTO->getRazonSocial() . "||CUIT|" . $facturaDTO->getCuit() . "|N|" . $facturaDTO->getDomicilio() . "|||Comprobante: " . $facturaDTO->getComprobante() . "||C<EOF>";
    for ($i = 0; $i < count($detalle); $i++)
    {
      $out .="@FACTITEM|" . $detalle[$i]->getDescripcion() . "|" . $detalle[$i]->getCantidad() . ".0|" . $detalle[$i]->getImporte() . ".00|0.21|M|1|0||||0|0<EOF>";
      $total += $detalle[$i]->getImporte();
    }
    $out .="@FACTPAGO|PAGO|" . $comprobante->getTotalComprobante() . ".00|T<EOF>";
    $out .="@FACTCIERRA|T|B|FINAL<EOF>";
    return $out;
  }

  function emitirFacturaFiscal(FacturaDTO $facturaDTO)
  {
    $fp = @fsockopen($_SERVER['REMOTE_ADDR'], PUERTO_FACTU, $errno, $errstr, 10);
    $result = "";
    if (!$fp)
    {
      return ERROR_SOCKET_CONN;
    } else
    {
      $tipoFacturaDTO = new TipoFacturaDTO();
      $tipoFacturaDTO = $facturaDTO->getTipoFactura();
      $tipoFactura = $tipoFacturaDTO->getCodigo();
      if ($tipoFactura == "A")
        $out = $this->generarFacturaA($facturaDTO);
      else
      {
        $out = $this->generarFacturaB($facturaDTO);
      }
      fwrite($fp, $out);
      while (!feof($fp))
      {
        $result .= fgets($fp, 128);
      }
      fclose($fp);
      if ($result != '-1')
      {
        $fp = @fsockopen($_SERVER['REMOTE_ADDR'], PUERTO_FACTU, $errno, $errstr, 10);
        if (!$fp)
        {
          return ERROR_SOCKET_CONN;
        } else
        {
          $result = "";
          $out = ord($tipoFactura) . "<EOF>";
          fwrite($fp, $out);
          while (!feof($fp))
          {
            $result .= fgets($fp, 128);
          }
        }
        fclose($fp);
      } else
      {
        $result = ERROR_LEER_NRO_FACTURA;
      }
      //HAY QUE DEVOVLER EL NUMERO DE FACTURA EMITIDO
      return $result;
    }
  }

  function CierreX()
  {
    $fp = @fsockopen($_SERVER['REMOTE_ADDR'], PUERTO_FACTU, $errno, $errstr, 10);
    $out = "";
    $result = "0";
    if (!$fp)
    {
      return ERROR_SOCKET_CONN;
    } else
    {
      $out .= "@CIERREX|...<EOF>";
      fwrite($fp, $out);
      while (!feof($fp))
      {
        $result .= fgets($fp, 128);
      }
      fclose($fp);
    }
    return $result;
  }

  function CierreZ()
  {
    $fp = @fsockopen($_SERVER['REMOTE_ADDR'], PUERTO_FACTU, $errno, $errstr, 10);
    $out = "";
    $result = "0";
    if (!$fp)
    {
      return ERROR_SOCKET_CONN;
    } else
    {
      $out .= "@CIERREZ|...<EOF>";
      fwrite($fp, $out);
      while (!feof($fp))
      {
        $result .= fgets($fp, 128);
      }
      fclose($fp);
    }
    return $result;
  }

  function aDTO(Factura $factura)
  {
    $facturaDTO = new FacturaDTO();
    $facturaDTO->setDocumento($factura->getCuit());
    $facturaDTO->setDomicilio($factura->getDomicilio());
  }

  function deDto(FacturaDto $facturaDto)
  {
    $factura = new Factura();
    $tfServicios = new TipoFacturaServicios();
    $tipoFactura =$tfServicios->deDTO($facturaDto->getTipoFactura());
    $factura->setComprobante($facturaDto->getComprobante());
    $factura->setCuit($facturaDto->getCuit());
    $factura->setNombre($facturaDto->getRazonSocial());
    $factura->setDetalleFactura($facturaDto->getDetalle());
    $factura->setFechaHora($facturaDto->getFechaHora());
    $factura->setFormaDePago($facturaDto->getFormaPago());
    $factura->setId($facturaDto->getId());
    $factura->setNroFactura($facturaDto->getNroFactura());
    $factura->setTipoIva($facturaDto->getTipoIva());
    $factura->setTipoFactura($tipoFactura);
    $factura->setDomicilio($facturaDto->getDomicilio());
    return $factura;
  }

}

?>
